package com.dcy.daily.skill.rabbitMQ.official.workQueue;

import com.dcy.daily.skill.rabbitMQ.official.utils.MQConnectUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * Work Queue
 * 消费者
 * RabbitMQ 的学习例子（https://www.rabbitmq.com/tutorials/tutorial-one-java.html）。
 * 使用该例子的时候，需要手动下载连接MQ的Java客户端（amqp-client-5.7.1.jar），此jar包
 * 为手动添加，并没使用maven，在启动的时候可手动添加，后续随着学习的深入可换成maven依赖，
 * 或者使用Springboot来自动装配。
 *
 * @author duanchunyu
 * @version 1.0.0
 * @createTime 2021年07月15日 16:43
 */
public class Worker {

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception{
        Connection connection = MQConnectUtil.getConnection();
        Channel channel = connection.createChannel();
        //不允许MQ向繁忙worker的分配消息
        channel.basicQos(1);
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
        //设置自动Ack为false
        boolean autoAck = false;
        channel.basicConsume(QUEUE_NAME, autoAck, (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            try {
                doWork(message);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println(" [x] Received '" + message + "'");
                channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
            }
        }, consumerTag -> {
        });
    }

    public static void doWork(String task) throws InterruptedException {
        for (char ch : task.toCharArray()) {
            if( ch == '.'){
                Thread.sleep(1000);
            }
        }
    }
}
